/*
 * logging.h
 *
 *  Created on: 2010/08/27
 *      Author: zjumty@gmail.com
 */

#ifndef LOGGING_H_
#define LOGGING_H_

#include <fstream>
#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <stdlib.h>
#include "block_queue.h"


using namespace std;

// ログ
class logging
{
public:
    // ログレベル
    static const string LEVEL_WARN;
    static const string LEVEL_ERROR;
    static const string LEVEL_INFO;
    static const string LEVEL_DEBUG;

public:
    // インスタンスを取得する。
    static logging* get();
    // インスタンスを削除する。
    static void finalize();
    // 初期化
    static int init();

public:
    // 初期化出力ファイルを設定する。
    void set_file(const string &filename);
    // 初期化ロカール設定する。
    void set_locale(std::locale loc);
    // 同期実行かどうか
    void set_sync(bool sync);

public:
    void debug(const char* text);
    void debug_f(const char* fmt, ...);
    void warn(const char* text);
    void warn_f(const char* fmt, ...);
    void info(const char* text);
    void info_f(const char* fmt, ...);
    void error(const char* text);
    void error_f(const char* fmt, ...);

protected:
    // デストラクタ
    virtual ~logging();
    // 旧出力を閉じる
    void close_out();

private:
    // インスタンス
    static logging* instance;

private:
    // 見れないコンストラクタ
    logging();
    // 出力ファイル
    std::ofstream out;
    // ログメッセージキュー
    block_queue<string> log_que;
    // 出力スレッド
    boost::thread *log_thead;
    // 同期実行モードで出力排他制御
    boost::mutex log_guard;
    // 同期実行モード
    bool is_sync;

private:
    void log(const string& level, const char* text);
};

#endif /* LOGGING_H_ */
